home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / webx / webxp040.lzh / Source / Plain2Xpression.c < prev    next >
C/C++ Source or Header  |  1998-09-27  |  5KB  |  207 lines

  1. /* âeâLâXâgâtâ@âCâïé≡ Xpression î`Ä«é╔ò╧è╖ */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/dos.h>
  7. #include "WebXpression.h"
  8. #include "Jis2sjis.h"
  9.  
  10. /* É▄éΦò╘é╖âhâbâgÉö */
  11. #define WRAP_DOT    (short)512
  12. #define LINE_Y    16
  13.  
  14. #define YOYUU    1024
  15.  
  16. extern void McPrint (char *);
  17. extern int line_table_size;
  18.  
  19. extern char kmode;
  20.  
  21.  
  22.  
  23. XPTEXT *Plain2Xpression (HTTPFILE * httpfile, XPTEXT * old_xptext)
  24. {
  25.     XPTEXT *xptext;        /* ò╘éΦÆl */
  26.     LINE_PTR *l;        /* î╗ì▌Åêù¥é╡é─éóéΘìsâeü[âuâï */
  27.     unsigned short w;    /* âhâbâgÉö */
  28.     unsigned char *t1, *t2;    /* î╗ì▌Åêù¥é╡é─éóéΘò╢ÄÜ */
  29.     unsigned char *t1e, *t2e;    /* t1,t2 é╠ûûö÷ */
  30.     unsigned char *t1_old;    /* üuÅêù¥é╡é╜ò╢ÄÜé≡ô╟é▄é╚é⌐é┴é╜Äûé╔é╖éΘüvùp */
  31.     unsigned char *t2t;    /* é╗é╠ìsé╠ɵô¬é╠ t2 */
  32.     unsigned int t2_size = 0;    /* t2 é╠âTâCâY */
  33.     unsigned char font_size = 6;    /* ö╝èpò╢ÄÜé╠æσé½é│ */
  34.     unsigned char temp_kmode = kmode;    /* ò╢ÄÜâRü[âh */
  35.     char aork = 0;        /* JIS ùp ASCII(=0) or KANJI(=!0) */
  36.     unsigned short org_line = 0;    /* î│é╠ HTML é╠ë╜ìsû┌é╛é┴é╜é⌐ */
  37.  
  38.     xptext = _dos_malloc (sizeof (XPTEXT));
  39.     xptext->text = NULL;
  40.     xptext->line_ptr = NULL;
  41.     *(xptext->title) = '\0';
  42.     strcpy (xptext->title, "â^âCâgâïûóÉ▌ÆΦ");
  43.  
  44. #define XPTEXT_BUFFER_YOYUU    32768
  45.     /* é▒éΩê╩éáéΩé╬æ½éΦéΘé⌐é╚üH */
  46.     t2_size = httpfile->content_length * 2 + XPTEXT_BUFFER_YOYUU;
  47.  
  48.     if ((xptext->text = _dos_malloc (t2_size)) == NULL) {
  49.         McPrint ("üª âüâéâèé¬æ½éΦé▄é╣é±üiâeâLâXâgâoâbâtâ@ùpé╠âüâéâèé¬èmò█é┼é½é▄é╣é±üj\n");
  50.         return (NULL);
  51.     }
  52.     /* ùvé╖éΘé╔ *t1 é⌐éτ *t2 é╔É«î`é╡é╚é¬éτâRâsü[é╡é─éóé¡éφé»é╛ */
  53.     t1 = httpfile->content;    /* âeâLâXâgâtâ@âCâïû{æ╠é╓é╠â|âCâôâ^ */
  54.     t1e = t1 + httpfile->content_length;    /* t1 é¬ t1e é╔ÆBé╡é╜éτÅIù╣ */
  55.     t2 = xptext->text;    /* xptext âoâbâtâ@é╓é╠â|âCâôâ^ */
  56.     t2e = t2 + t2_size - YOYUU;
  57.     /* t2 é¬ t2e é╔ÆBé╡é╜éτÅIù╣üiâoâbâtâ@òsæ½üj */
  58.  
  59.     if ((xptext->line_ptr = _dos_malloc (sizeof (LINE_PTR) * line_table_size)) == NULL) {
  60.         McPrint ("üª âüâéâèé¬æ½éΦé▄é╣é±üiìsô¬âèâXâgùpâüâéâèé¬èmò█é┼é½é▄é╣é±üj\n");
  61.         return (NULL);
  62.     }
  63.     l = xptext->line_ptr;
  64.     xptext->line = 0;
  65.     xptext->current_line = 0;
  66.     xptext->link_table = NULL;
  67.     xptext->link_table_buffer = NULL;
  68.     xptext->image_table = NULL;
  69.     xptext->link_table_max = 0;
  70.     xptext->image_table_max = 0;
  71.  
  72.     /* ìsâïü[âv */
  73.     do {
  74.         w = 0;
  75.         t2t = t2;
  76.  
  77.         /* îàâïü[âv */
  78.         do {
  79.             unsigned char c;    /* Åêù¥é╖éΘò╢ÄÜ */
  80.  
  81.             t1_old = t1;
  82.             c = *t1++;
  83.  
  84.             /* JIS Ä₧é╠è┐ÄÜ IN/OUT âtâëâOé╠Åêù¥ */
  85.             if (c == 0x1b) {    /* ESC */
  86.                 /* ò╢ÄÜâRü[âhé¬ö╗éτé╚éóÄ₧é╔ ESC é≡î⌐é┬é»é╜éτ JIS é╞ö╗ÆΦ */
  87.                 if (temp_kmode == K_AUTO)
  88.                     temp_kmode = K_JIS;
  89.                 if (temp_kmode == K_JIS) {
  90.                     unsigned char c1 = *(t1 + 1);
  91.                     switch (*t1) {
  92.                     case '(':
  93.                         if ((c1 == 'B') || (c1 == 'J')) {    /* è┐ÄÜ OUT */
  94.                             aork = 0;
  95.                             t1 += 2;
  96.                         }
  97.                         break;
  98.                     case '$':
  99.                         if ((c1 == '@') || (c1 == 'B')) {    /* è┐ÄÜ IN */
  100.                             aork = !0;
  101.                             t1 += 2;
  102.                         }
  103.                         break;
  104.                     default:
  105.                         break;
  106.                     }
  107.                     continue;
  108.                 }
  109.             }
  110.             /* ò╢ÄÜâRü[âhé¬é▄é╛ö╗éτé╚éóÄ₧ */
  111.             if (temp_kmode == K_AUTO) {
  112.                 /* 0x81~0x9f é≡î⌐é┬é»é╜éτ SJIS é╞ö╗ÆΦ */
  113.                 if ((c >= 0x81) && (c <= 0x9f))
  114.                     temp_kmode = K_SJIS;
  115.                 /* 0xa1~0xcf é≡î⌐é┬é»é╜éτ EUC é╞ö╗ÆΦ */
  116.                 if ((c >= 0xa1) && (c <= 0xcf))
  117.                     temp_kmode = K_EUC;
  118.             }
  119.             if (c == 0x0d) {
  120.                 aork = 0;
  121.                 org_line++;
  122.                 if (*t1 == 0x0a)
  123.                     t1++;
  124.                 break;
  125.             }
  126.             if (c == 0x0a) {
  127.                 aork = 0;
  128.                 org_line++;
  129.                 break;
  130.             }
  131.             if (c == 0x09) {
  132.                 if (w + font_size * 8 > WRAP_DOT) {
  133.                     t1 = t1_old;    /* ô╟é▄é╚é⌐é┴é╜é▒é╞é╔é╖éΘ */
  134.                     break;
  135.                 } else {
  136.                     *t2++ = c;
  137.                     w = (w + font_size * 8) / (short) (font_size * 8) * (short) (font_size * 8);
  138.                     continue;
  139.                 }
  140.             }
  141.             if (c < ' ') {
  142.                 //*t2++ = c;
  143.                 //w += font_size;
  144.                 break;
  145.             }
  146.             if (((c == '`') && (temp_kmode <= K_EUC))    /* AUTO or SJIS or EUC */
  147.                 ||((temp_kmode == K_JIS) && (!aork) && (c == '`'))) {
  148.                 if (w + font_size > WRAP_DOT) {
  149.                     t1 = t1_old;    /* ô╟é▄é╚é⌐é┴é╜é▒é╞é╔é╖éΘ */
  150.                     break;
  151.                 }
  152.                 *t2++ = c;    /* '`' é═ '``' é╔ */
  153.                 *t2++ = c;
  154.                 w += font_size;
  155.                 continue;
  156.             }
  157.             if (((temp_kmode <= K_EUC) && (c < 0x80))    /* AUTO or SJIS or EUC */
  158.                 ||((temp_kmode == K_JIS) && (!aork))) {
  159.                 /* éPâoâCâgò╢ÄÜé╠ÅΩìç */
  160.                 if (w + font_size > WRAP_DOT) {
  161.                     t1 = t1_old;    /* ô╟é▄é╚é⌐é┴é╜é▒é╞é╔é╖éΘ */
  162.                     break;
  163.                 }
  164.                 *t2++ = c;
  165.                 w += font_size;
  166.                 continue;
  167.             } else {
  168.                 /* è┐ÄÜé╠ÅΩìç */
  169.                 if ((w + font_size * 2) > WRAP_DOT) {
  170.                     t1 = t1_old;    /* ô╟é▄é╚é⌐é┴é╜é▒é╞é╔é╖éΘ */
  171.                     break;
  172.                 }
  173.                 switch (temp_kmode) {
  174.                 case K_AUTO:
  175.                 case K_SJIS:
  176.                     *t2++ = c;
  177.                     *t2++ = *t1++;
  178.                     break;
  179.                 case K_EUC:
  180.                     Jis2sjis (((c & 0x7f)), (*t1++ & 0x7f), t2);
  181.                     break;
  182.                 case K_JIS:
  183.                     Jis2sjis (c, *t1++, t2);
  184.                     break;
  185.                 }
  186.                 w += font_size * 2;
  187.                 continue;
  188.             }
  189.         } while ((t1 < t1e) && (t2 < t2e));
  190.  
  191.         l->start_dot = 0;
  192.                 l->org_line = org_line;
  193.         l->num = t2 - t2t;
  194.         l++->ptr = t2t;
  195.         xptext->line++;    /* ìsÉö */
  196.     } while ((t1 < t1e) && (t2 < t2e));
  197.     l->ptr = NULL;
  198.  
  199.     xptext->kmode = temp_kmode;
  200.  
  201.     /* ù]ò¬é╔èmò█é╡é╜âüâéâèâuâìâbâNé≡É╪éΦÄ╠é─éΘ */
  202.     _dos_setblock (xptext->text, (int) t2 - (int) (xptext->text));
  203.     _dos_setblock (xptext->line_ptr, sizeof (LINE_PTR) * (xptext->line));
  204.  
  205.     return (xptext);
  206. }
  207.